﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using DevMaker.SIC.Model.BaseObject;
using log4net;

namespace DevMaker.SIC.Model {
    public class Turno : IdentifiableObject {
        private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public Usuario Cajero { set; get; }
        public Usuario SupervisorApertura { set; get; }
        public Usuario SupervisorCierre {
            get {
                if (Cierre != null && Cierre.Supervisor != null) return Cierre.Supervisor;
                return null;
            }
        }
        public PuntoVenta PuntoVenta { set; get; }
        public DateTime FechaInicio { set; get; }
        public DateTime? FechaCierre { set; get; }
        public Reposicion ReposicionInicial {
            get {
                if (Reposiciones != null && Reposiciones.Count > 0)
                    return Reposiciones[0];
                return null;
            }
        }
        public List<Reposicion> Reposiciones { set; get; }
        public List<Observacion> Observaciones { set; get; }
        public Cierre Cierre { set; get; }
        public EstadoTurno EstadoTurno { set; get; }
        public Sucursal Sucursal { set; get; }
        public Turno() {
            Reposiciones = new List<Reposicion>();
            Observaciones = new List<Observacion>();
        }

        public void ReadFromDataReader(SqlDataReader reader) {
            try {
                Id = Convert.ToInt64(reader["turno_id"]);
                FechaInicio = Convert.ToDateTime(reader["turno_fecha_inicio"]);
                if (!String.IsNullOrEmpty(reader["turno_fecha_termino"].ToString()))
                    FechaCierre = Convert.ToDateTime(reader["turno_fecha_termino"]);
                Cajero = new Usuario();
                Cajero.ReadFromDataReader(reader);
                if (!String.IsNullOrEmpty(reader["supervisor_User_intUserNo"].ToString())) {
                    SupervisorApertura = new Usuario();
                    SupervisorApertura.ReaderSupervisorFromDataReader(reader);
                }
                if (!String.IsNullOrEmpty(reader["Workstation_strCode"].ToString())) {
                    PuntoVenta = new PuntoVenta();
                    PuntoVenta.ReadFromDataReader(reader);
                }

                if (reader["turno_id_estado"].ToString() == "1")
                    EstadoTurno = EstadoTurno.Abierto;
                else
                    EstadoTurno = EstadoTurno.Cerrado;
            } catch (Exception ex) {
                Log.Error(ex);
            }
        }

        public String GenereteHTMLTableForReposicion() {
            var header = GenerateHTMLHeaderForReposicion();
            var body = GenerateHTMLBodyForReposicion();
            var html = String.Format("<table class=\"table table-hover\">{0}{1}</table>", header, body);
            return html;
        }

        public String GenereteHTMLTableForCierre() {
            var header = GenerateHTMLHeaderForReposicion();
            header = header.Replace("Cantidad", "Cantidad Real");
            var body = GenerateHTMLBodyForReposicion();
            var html = String.Format("<table class=\"table table-hover\">{0}{1}</table>", header, body);
            return html;
        }
        public String GenereteHTMLTableForReporteCierre() {
            var header = GenerateHTMLHeaderForReporteCierre();
            var body = GenerateHTMLBodyForReporteCierre();
            var html = String.Format("<table class=\"table table-hover\">{0}{1}</table>", header, body);
            return html;
        }

        private String GenerateHTMLHeaderForReposicion() {
            const string tmpl = @"<thead>
                              <tr>
                                <th>#</th>
                                <th>Producto</th>
                                {0}
                                <th>Cantidad</th>
                              </tr>
                            </thead>";
            var cantidadReposiciones = String.Empty;
            for (var i = 0; i < Reposiciones.Count; i++) {
                cantidadReposiciones = cantidadReposiciones + String.Format("<th>#{0}</th>", i + 1);
            }
            var html = String.Format(tmpl, cantidadReposiciones);
            return html;
        }
        private String GenerateHTMLHeaderForReporteCierre() {
            const string tmpl = @"<thead>
                              <tr>
                                <th>#</th>
                                <th>Producto</th>
                                {0}
                                <th>A<br/>Entregada</th>
                                <th>B<br/>Ventas</th>
                                <th>C<br/>Caja</th>
                                <th colspan=""2"">A-B-C<br/>Diferencia</th>
                              </tr>
                            </thead>";
            var cantidadReposiciones = String.Empty;
            for (var i = 0; i < Reposiciones.Count; i++) {
                cantidadReposiciones = cantidadReposiciones + String.Format("<th>#{0}</th>", i + 1);
            }
            var html = String.Format(tmpl, cantidadReposiciones);
            return html;
        }

        private String GenerateHTMLBodyForReposicion() {
            var html = String.Empty;
            var productos = ReposicionInicial.Detalle.Select(detalle => detalle.Producto).ToList();
            productos.Sort((foo, bar) => foo.Nombre.CompareTo(bar.Nombre));
            var i = 0;
            foreach (var producto in productos) {
                var textoControl =
                    @"<table><tbody><tr><td>
                <input type='range' min='0' max='100' value='0' onchange=""updateTextInput('cantidad_$p.Id$',this.value);"" style='width:150px' name='cantidadRange_$p.Id$'  id='cantidadRange_$p.Id$'> 
                </td>
                <td valign=""top"" nowrap=""nowrap"">&nbsp;<input type='text' class=""numKeyboard"" id='cantidad_$p.Id$' name='cantidad_$p.Id$' style='width:30px' value='0' onchange=""updateTextInput('cantidadRange_$p.Id$',this.value);""  ></td>
              </tr></tbody></table>";
                textoControl = textoControl.Replace("$p.Id$", producto.Id.ToString());
                var textoreposiciones = String.Empty;
                foreach (Reposicion reposicion in Reposiciones)
                    foreach (ReposicionDetalle det in reposicion.Detalle)
                        if (det.Producto.Id == producto.Id)
                            textoreposiciones = textoreposiciones + String.Format("<td>{0}</td>", det.Cantidad);
                var fila = "<tr><td>{0}</td><td>{1}</td>{2}<td>{3}</td></tr>" + Environment.NewLine;
                html = html + String.Format(fila, i + 1, producto, textoreposiciones, textoControl);
                i++;
            }
            return "<tbody>" + html + "</tbody>";
        }
        private String GenerateHTMLBodyForReporteCierre() {
            var html = String.Empty;
            var productos = ReposicionInicial.Detalle.Select(detalle => detalle.Producto).ToList();
            productos.Sort((foo, bar) => foo.Nombre.CompareTo(bar.Nombre));
            var i = 0;
            foreach (var producto in productos) {
                var textoreposiciones = String.Empty;
                foreach (Reposicion reposicion in Reposiciones)
                    foreach (ReposicionDetalle det in reposicion.Detalle)
                        if (det.Producto.Id == producto.Id)
                            textoreposiciones = textoreposiciones + String.Format("<td>{0}</td>", det.Cantidad);

                var textoCierre = String.Empty;
                if (Cierre != null && Cierre.Detalle != null)
                    foreach (var det in Cierre.Detalle)
                        if (det.Producto.Id == producto.Id) {
                            var textoCierreTemp =
                                          String.Format("<td>{0}</td><td>{1}</td><td>{2}</td><td align='right'>{3}{4}</td><td>[icono]</td>",
                                                        det.CantidadEntregada, det.CantidadVendida, det.CantidadFisicaEnCaja,
                                                        det.DiferenciaSigno, det.Diferencia);
                            if (det.Diferencia == 0) {
                                textoCierreTemp = textoCierreTemp.Replace("[icono]",
                                                        @"<span class=""label label-success""><span class=""glyphicon glyphicon-ok""></span></span>");
                            } else {
                                textoCierreTemp = textoCierreTemp.Replace("[icono]",
                                                        @"<span class=""label label-danger""><span class=""glyphicon glyphicon-thumbs-down""></span></span>");
                            }
                            textoCierre = textoCierre + textoCierreTemp;
                        }
                var fila = "<tr><td>{0}</td><td>{1}</td>{2}{3}</tr>" + Environment.NewLine;
                html = html + String.Format(fila, i + 1, producto, textoreposiciones, textoCierre);
                i++;
            }
            return "<tbody>" + html + "</tbody>";
        }

    }


}
